function defineReactive(obj, key, val) {
  if (arguments.length === 2) {
    val = obj[key];
  }
  if (typeof val === "object") {
    new Observer(val);
  }
  const dep = new Dep(); //实例化一个依赖管理器，生成一个依赖管理数组dep
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get() {
      dep.depend(); // 在getter中收集依赖
      return val;
    },
    set(newVal) {
      if (val === newVal) {
        return;
      }
      val = newVal;
      dep.notify(); // 在setter中通知依赖更新
    },
  });
}
// 其实在Vue中还实现了一个叫做Watcher的类，
// 而Watcher类的实例就是我们上面所说的那个"谁"。
// 换句话说就是：谁用到了数据，谁就是依赖，
// 我们就为谁创建一个Watcher实例。在之后数据变化时，
// 我们不直接去通知依赖更新，而是通知依赖对应的Watch实例，
// 由Watcher实例去通知真正的视图。